# 不可变类型： int bool float 字符串str
def no_change(num):
    print(f"num={num},num's address={id(num)}")
    num = 5
    print(f"num={num},num's address={id(num)}")


a = 10
print(f"函数调用前的地址{id(a)}")
# 函数调用前的地址140715862268632
no_change(a)
# 不可变类型 变量重新赋值后，相当于引用地址改变
# num=10,num's address=140715862268632
# num=5,num's address=140715862268472
print(f"函数调用后的地址{id(a)}")
# 函数调用后的地址140715862268632

print('-' * 50)


# 可变类型：列表list 字典dict 集合set
def change(new_list):
    print(f"赋值前，new_list的地址{id(new_list)},{new_list}")
    '''
    new_list[0] = 10
    # 可变类型 部分元素重新赋值后，指向的地址不改变，但指向的内存内容改变
    # 赋值前，new_list的地址2153587528064
    # 赋值后，new_list的地址2153587528064
    '''
    new_list=[5,6]
    # 全部元素都改变，则其指向其他地址
    # 赋值前，new_list的地址1705904951680,[1, 2, 3]
    # 赋值后，new_list的地址1705910341120,[5, 6]
    print(f"赋值后，new_list的地址{id(new_list)},{new_list}")


my_list = [1, 2, 3]
print(f"调用change之前{my_list},地址{id(my_list)}")
# 调用change之前[1, 2, 3],地址2153587528064
change(my_list)
print(f"调用change之后{my_list}，地址{id(my_list)}")
# 调用change之后[10, 2, 3]，地址2153587528064
